package jacky.lanlan.song.closure;

/**
 * 代表一个判断，可作为 <code>Closure</code> 使用。
 * @param T 需要判断的对象类型
 * @author Jacky.Song
 */
public interface Judgment<T>{
	
	/**
	 * 参数是否可以通过该判断。
	 */
	public boolean canPass(T arg);
	
	/**
	 * 空字符串的判断。<br/>
	 * 当且仅当参数字符串为空时通过。
	 */
	public static final Judgment<String> EMPTY_STRING=new Judgment<String> () {
		public boolean canPass(String arg) {
			return arg==null || arg.equals("");
		}
	};
	
	/**
	 * 无穷判断。<br/>
	 * 当且仅当参数值为无穷时通过。
	 */
	public static final Judgment<Double> INFINITE=new Judgment<Double> () {
		public boolean canPass(Double arg) {
			return Double.isInfinite(arg);
		}
	};
	
	/**
	 * 负数判断。<br/>
	 * 当且仅当参数值为负数时通过。
	 */
	public static final Judgment<Double> NEGATIVE=new Judgment<Double> () {
		public boolean canPass(Double arg) {
			return arg<0;
		}
	};
	
	/**
	 * 0判断。<br/>
	 * 当且仅当参数值为0时通过。
	 */
	public static final Judgment<Double> ZERO=new Judgment<Double> () {
		public boolean canPass(Double arg) {
			return arg==0;
		}
	};
	
}